﻿using System;
using System.Linq;
using System.Activities;
using System.Activities.Statements;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using StandardFeatures;
using System.Activities.Persistence;
using System.Runtime.DurableInstancing;
using System.Activities.DurableInstancing;
using System.Threading;
using System.Text.RegularExpressions;
using System.Activities.Tracking;

namespace _10._40._05_KontanthjaelpMain
{
    class Program
    {
        static AutoResetEvent idleEvent = new AutoResetEvent(false);
        static AutoResetEvent syncEvent = new AutoResetEvent(false);
        static Guid instanceId = Guid.Empty;

        static void Main(string[] args)
        {
            Kommune denneKommune = CreateTestCounty();
            KO534 ansøgning = CreateTestApplication();

            Dictionary<string, object> arguments = new Dictionary<string, object>();
            arguments.Add("denneKommune", denneKommune);
            arguments.Add("ansøgning", ansøgning);

            
            
            WorkflowApplication wfApp = SetupInstance(arguments);
            wfApp.Run();
            
            WaitHandle[] handles = new WaitHandle[] { syncEvent, idleEvent };
            while (WaitHandle.WaitAny(handles) != 0)
            {
                string line = Console.ReadLine();

                wfApp = SetupInstance(null);
                wfApp.Load(instanceId);
                var bookmarks = wfApp.GetBookmarks();

                do
                {
                    Regex guidRegEx = new Regex(@"^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$");
                    if (guidRegEx.IsMatch(bookmarks.Last().BookmarkName))
                    {
                        bool answer = GetBoolAnswer(line);
                        wfApp.ResumeBookmark(bookmarks.Last().BookmarkName, answer);
                        break;
                    }
                    else if (bookmarks.Count(b => b.BookmarkName.ToLower().Equals(line)) > 0)
                    {
                        wfApp.ResumeBookmark(line, null);
                        break;
                    }

                    List<string> bookmarkNames = new List<string>();
                    foreach (var bookmark in bookmarks)
                    {
                        if (!guidRegEx.IsMatch(bookmark.BookmarkName))
                        {
                            bookmarkNames.Add(bookmark.BookmarkName);
                        }
                    }
                    ConsoleTalker.Write("Du har følgende muligheder: ", ConsoleColor.Magenta);
                    ConsoleTalker.WriteLine(string.Join(", ", bookmarkNames), ConsoleColor.White);

                    line = Console.ReadLine();
                } while (true);
            }

            Console.WriteLine("Press ENTER to exit...");
            Console.ReadLine();
        }

        private static bool GetBoolAnswer(string line)
        {
            bool? answer = null;
            while (!answer.HasValue)
            {
                if (line.ToUpper().StartsWith("J"))
                {
                    answer = true;
                    break;
                }
                else if (line.ToUpper().StartsWith("N"))
                {
                    answer = false;
                    break;
                }
                ConsoleTalker.Write("Du har følgende muligheder: ", ConsoleColor.Magenta);
                ConsoleTalker.WriteLine("j, n", ConsoleColor.White);

                line = Console.ReadLine();
            }
            return answer.Value;
        }

        private static WorkflowApplication SetupInstance(Dictionary<string, object> arguments)
        {
            WorkflowApplication wfApp;
            if (arguments == null)
            {
                wfApp = new WorkflowApplication(new Workflow1());
            }
            else
            {
                wfApp = new WorkflowApplication(new Workflow1(), arguments);
            }

            wfApp.Aborted = e =>
            {
                ConsoleTalker.WriteLine("Workflow aborted: " + e.Reason, ConsoleColor.Cyan);
                syncEvent.Set();
            };
            wfApp.OnUnhandledException = e =>
            {
                ConsoleTalker.WriteLine("Workflow er afbrudt", ConsoleColor.Red);
                ConsoleTalker.WriteLine("Workflow unhandled exception: " + e.UnhandledException.Message, ConsoleColor.DarkRed);
                return UnhandledExceptionAction.Terminate;
            };
            wfApp.PersistableIdle = e =>
            {
                idleEvent.Set();
                return PersistableIdleAction.Unload;
            };
            wfApp.Completed = e =>
            {
                if (e.Outputs.ContainsKey("svar"))
                {
                    ConsoleTalker.WriteLine("Workflow svarer: " + e.Outputs["svar"].ToString(), ConsoleColor.Green);
                }
                else
                {
                    ConsoleTalker.WriteLine("Workflow færdig uden svar", ConsoleColor.Green);
                }
                syncEvent.Set();
            };

            SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(Properties.Settings.Default.PersistenceConnectionString);
            wfApp.InstanceStore = store;

            if (instanceId == Guid.Empty)
            {
                instanceId = wfApp.Id;
            }

            wfApp.Extensions.Add(new EtwTrackingParticipant());

            return wfApp;
        }

        private static Kommune CreateTestCounty()
        {
            Kommune nyKommune = new Kommune()
            {
                Navn = "Københavns Kommune",
                Vejnavn = "Nyropsgade",
                Husnummer = 1,
                Postnummer = 1602,
                By = "København V",
            };

            return nyKommune;
        }

        private static KO534 CreateTestApplication()
        {
            KO534 ansøgning = new KO534();

            ansøgning.Kommunen = new Kommune()
            {
                Navn = "Københavns Kommune",
                Vejnavn = "Nyropsgade",
                Husnummer = 1,
                Postnummer = 1602,
                By = "København V",
            };

            ansøgning.Henvendelsesdato = new DateTime(2011, 10, 01);
            ansøgning.ModtagetDato = new DateTime(2011, 10, 02);
            ansøgning.SagsbehandlerId = 45839;
            ansøgning.PersonligeOplysninger = new PersonOplysninger()
            {
                Navn = "Søren Hansen",
                Vejnavn = "Gyvelvej",
                Husnummer = 43,
                Postnummer = 2400,
                By = "København NV",
                Personnummer = 100419752341,
                Telefonnummer = 23894733,
                Tilflytningsdato = new DateTime(2001, 02, 15),
                SidsteBopælsKommune = new Kommune()
                {
                    Navn = "Skovlunde Kommune",
                    Vejnavn = "Svinget",
                    Husnummer = 9,
                    Postnummer = 3400,
                    By = "Birkerød"
                },
                Civilstand = PersonOplysninger.CivilstandEnum.Enlig,
            };
            ansøgning.AnsøgningsÅrsag = new KO534.Årsag()
            {
                AnsøgningsÅrsag = KO534.Årsag.ÅrsagEnum.Arbejdsløshed_Opsagt,
                FraDato = new DateTime(2011, 09, 30),
            };
            ansøgning.AKasse = null;
            ansøgning.IndtægterAnsøger = new KO534.Indtægt()
            {
                SidsteIndtægt = new DateTime(2011, 09, 01),
                Udbetaling = 25000,
                Indtægtskilde = KO534.Indtægt.IndtægtskildeEnum.Løn,
            };
            ansøgning.FormueForhold = new KO534.Formue()
            {
                Kontanter = 1800,
                Pengeinstituter = 3039,
                Pension = 0,
                Børneopsparing = 0,
                Værdipapirer = 0,
                Transportmidler = new List<KO534.Formue.TransportEnum>()
                {
                    KO534.Formue.TransportEnum.Bil
                },
                TransportmidlerVærdi = 15000,
            };
            ansøgning.Bolig = new KO534.Boligforhold()
            {
                Husleje = 50000,
                Boligsikring = 0,
                Fremlejeindtægt = 0,
                Varme = 10000,
                ElGas = 4000,
            };

            return ansøgning;
        }
    }
}
